package com.test22_日期时间;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 多线程下操作日期时间格式化
 */
public class Demo05_DateTimeFormatter {

    public static void main(String[] args) {
//        test1();
//        test2();
//        test3();
//        test4();
        test5();
    }

    public static void test1() {
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                // 每个线程都单独定义一个SimpleDateFormat对象
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    System.out.println("【" + Thread.currentThread().getName() + "】" + sdf.parse("1998-02-17 21:15:32"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }, "SDF转换线程 - " + x).start();
        }
    }

    public static void test2() {
        // 多个线程访问同一个SimpleDateFormat对象，将字符串转日期
        // 会出现并发的问题
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                try {
                    System.out.println("【" + Thread.currentThread().getName() + "】" + sdf.parse("1998-02-17 21:15:32"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }, "SDF转换线程 - " + x).start();
        }
    }

    public static void test3() {
        // 多线程并发访问下的LocalDateTime转换
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ZoneId zoneId = ZoneId.systemDefault();     // 获取当前的时区ID
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                try {
                    LocalDateTime localDateTime = LocalDateTime.parse("1998-02-17 21:15:32", formatter);
                    Instant instant = localDateTime.atZone(zoneId).toInstant();
                    Date date = Date.from(instant);     // 字符串转为日期
                    System.out.println("【" + Thread.currentThread().getName() + "】" + date);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, "SDF转换线程 - " + x).start();
        }
    }

    public static void test4() {
        // 多线程并发访问下的LocalDate转换
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        ZoneId zoneId = ZoneId.systemDefault();     // 获取当前的时区ID
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                try {
                    LocalDate localDate = LocalDate.parse("1998-02-17", formatter);
                    Instant instant = localDate.atStartOfDay(zoneId).toInstant();
                    Date date = Date.from(instant);     // 字符串转为日期
                    System.out.println("【" + Thread.currentThread().getName() + "】" + date);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, "SDF转换线程 - " + x).start();
        }
    }

    public static void test5() {
        // 在多线程下使用SimpleDateFormat对象，将日期转换为字符串
        // 不会出错
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                System.out.println("【" + Thread.currentThread().getName() + "】" + sdf.format(new Date()));
            }, "SDF转换线程 - " + x).start();
        }
    }
}
